﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
using Imaginecup.util.input;
using Imaginecup.stateManager;
using Imaginecup.gameState;
using Imaginecup.factory;
using Imaginecup.shareData;
using Imaginecup.util;
using Imaginecup.util.script.malaria;

namespace Imaginecup
{
    /// <summary>
    /// 이것은 사용자 게임의  형식입니다.
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        private GameStateManager m_StateMan ;

#if XBOX
        private Texture2D m_Cursor;
#endif

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
           
#if WINDOWS
         //   graphics.PreferredBackBufferHeight = 600;
        //    graphics.PreferredBackBufferWidth = 800;
            IsFixedTimeStep = true;
#endif

#if WINDOWS_PHONE
            // Windows Phone의 기본 프레임 속도는 30fps입니다.
            TargetElapsedTime = TimeSpan.FromTicks(333333);

            // 잠금 상태에서 배터리 수명을 연장하십시오.
            InactiveSleepTime = TimeSpan.FromSeconds(1);

            graphics.SupportedOrientations = DisplayOrientation.Default;

            graphics.IsFullScreen = true;
#endif

        }

        /// <summary>
        /// 게임이 실행되기 전에 처리해야 할 모든 초기화를 실시할 수 있습니다. 
        /// 게임은 여기서 필요한 서비스를 질의(쿼리)할 수 있으며 비그래픽
        /// 관련 콘텐츠 또한 로드할 수 있습니다. base.Initialize를 호출하면 모든 구성 요소를 열거함과 동시에
        /// 모두 초기화합니다.
        /// </summary>
        protected override void Initialize()
        {
            //입력 초기화.

            StateShareData shareData = StateShareData.GetShareData();
            m_StateMan = new GameStateManager(this);

            shareData.SetGame(this);
            shareData.SetGameStateMan(m_StateMan);

            // TODO: 여기에 사용자의 초기화 논리 추가
#if WINDOWS_PHONE
            Components.Add( (IGameComponent)PhoneInputHandler.GetInputHandler() );
#endif
            Components.Add((IGameComponent)MouseInputHandler.GetInputHandler());
           
            ////게임스테이트 클래스에서 사용할 정적 요소 초기화.            
            m_StateMan.PushState((IGameState)StateFactory.GetStateFactory().GetObject(StateFactoryID.State_Title));//초기상태.

            base.Initialize();
        }

        /// <summary>
        /// LoadContent는 매 게임별로 한 번씩 호출되며 이 메서드에서
        /// 모든 사용자 콘텐츠를 로드합니다.
        /// </summary>
        protected override void LoadContent()
        {
            // 텍스쳐를 출력하는 데 사용할 수 있는 새 SpriteBatch를 생성하십시오.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            
            GraphicShareData GShareData = GraphicShareData.GetShareData();
            GShareData.SetSpriteBatch(spriteBatch);
            GShareData.SetGraphicDevice(this.GraphicsDevice);
            GShareData.SetGraphicDeviceMan(this.graphics);
            GShareData.SetBasicEffect(new BasicEffect(this.GraphicsDevice));
            // TODO: 여기서 this.Content를 이용해서 사용자 콘텐츠를 로드

#if XBOX
            m_Cursor = Content.Load<Texture2D>("util\\cursor");
#endif

        }

        /// <summary>
        /// UnloadContent는 매 게임별로 한 번씩 호출되며 이 메서드에서
        /// 모든 사용자 콘텐츠를 언로드합니다.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: 여기서 모든 비ContentManager 콘텐츠를 언로드
            Content.Unload();
        }


        /// <summary>
        /// 게임이 레벨 업데이트, 충돌 감지, 입력 감지 및 오디오 재생과
        /// 같은 게임 논리 코드를 실행할 수 있습니다.
        /// </summary>
        /// <param name="gameTime">타이밍 값의 스냅샷을 제공합니다.</param>+
        protected override void Update(GameTime gameTime)
        {
            // 게임이 종료할 수 있게 함
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
                       
            // TODO: 여기에 업데이트 논리 추가

            base.Update(gameTime);
        }

        /// <summary>
        /// 게임이 스스로 갱신해야 할 때 이 메서드를 호출합니다.
        /// </summary>
        /// <param name="gameTime">타이밍 값의 스냅샷을 제공합니다.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: 여기에 그래픽 출력 코드를 추가하십시오.

            base.Draw(gameTime);

#if XBOX
            IMouseInputHandler mouseInput = MouseInputHandler.GetInputHandler();
           GraphicShareData GShareData = GraphicShareData.GetShareData();
           GShareData.GetSpriteBatch().Begin();
           GShareData.GetSpriteBatch().Draw(m_Cursor, mouseInput.Position, Color.White);
           GShareData.GetSpriteBatch().End();
#endif
        }

    }
}
